Kotlin M6.1リリース

二ヶ月前にM6をリリースしました。そして今日、沢山の改善を含む次のステップへと移る準備ができました。

言語の改善

言語の新機能や改善が施されました

より良いインターフェース

タイプインターフェースにはスマートキャストが働きます。以下のコードが期待通り動作します:

val map: Map<String, String> = ...

if (str != null) {
   map[str] = "Something"
}

より良いキャスティング診断

コンパイラは賢くなり、不可能なキャストを検出します

val name: String = "Joe"
if (name is Iterable<*>) {
   ...
}

、といったコードはコンパイル時にエラーを出します。

特定のケースでは生のタイプへのキャストは推論が働きます

val values: MutableCollection = ...
if (values is List) {
   name = vaules[0]
}

さらに、else句はwhen節内で返値に関連がない場合は不要となりました。つまり、これはステートメントとして利用できます:

fun foo(x: Int) {
  when (x) {
     0 -> println("Zero")
     1 -> println("One")
  }
}

警告の抑止

任意の宣言や式にsuppressアノテーションをつけて(Cmd+Enterを押せばIntelliJ IDEAがやってくれます)、コンパイラの出す警告を抑止させることができます。未チェックキャストやリネームされたパラメータを含むいかなる警告に対して利用できます。

[suppress("UNCHECKED_CAST")]
fun  foo(x: Any): T {
    return x as T
}

ローカルリターンを名前付きラムダ式で

混乱を防ぐため、純粋なreturnは「名前付き関数からの戻り」と認識されます。つまりラムダ式内で”return x”と表記してそのラムダがxを返すという書き方は認められないことになります。この制約を和らげるため、本リリースより「ラムダ式内のラベル付きリターン」を書くことができるようになりました。たとえばfooという名前の関数があった場合

fun foo(func: () -> Int) { ... }

この関数を呼び出す際にラムダ式を渡して条件を確認して早期に戻すというコードが書けます

foo @myLambda { (): Int ->
   if (...)
       return@myLambda 10
   ...
}

この定義内で明示的なラベリングは必須ではありません。以下のように書くことも出来ます:

foo { () : Int ->
   return@foo 10
}

ラムダ式が関数に渡されたときは自動的にラベル付きとなります。

注意:ラムダ式内の明示的なリターンタイプは一時的に必要なもので、将来的に不要になる予定です

警告: メタデータフォーマットの変更

生成するバイトコードは以前とは大きく異なります。サイズはよりスリムになり、リフレクションは高速になりました。ただし以前のバージョンのKotlinでコンパイルしたバイトコードとは互換性がありません。

JavaScriptサポート

KotlinのJavaScriptサポートを利用して成功を収めている商用製品がある傍ら、JetBrainsは現在のところJVM向けにフォーカスしてきました。しかし、現在はJavaScriptサポートに全力を注いでおり今回のリリースで以下の機能を含めました:

  • Support for enums
  • Class Objects
  • Delegated properties
  • Multi-Declarations
  • SourceMaps

また今回のリリースでECMAScript 3サポートを非推奨としました。

ターゲットJavaScriptアプリケーションについてはより明確にしていく予定です。

IDEの改善

IntelliJ IDEAのKotlinサポートはより一層強力になりました:

  • Convert member function to extension function
  • Navigation to getters and setters of a delegated property (Ctlr+click on by)
  • Navigation to iterator/next/hasNext in a for loop (Ctlr+click on in)
  • Navigation to invoke() from a call site (Ctlr+click on parentheses)
  • Improvements on Find Usages including support for constructors  and overrides

さらにMavenやGradleベースプロジェクトの設定をUI周りから補完まで改善しています。

最後に、このリリースは最新のIntelliJ IDEA 13並びに最新のAndroid Studioをサポートします。

GitHubのリリースページよりコンパイラプラグインを取得できます。IntelliJ IDEAをご利用であれば設定画面より直接ダウンロードできます。

image description